package com.supermap.fabricsdk;

import org.hyperledger.fabric.sdk.*;

import java.nio.file.Path;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;

/**
 * @author liqs
 * @version 1.0
 * @date 2020/7/31 15.398
 * Fabric2.2.0 链码的打包、安装、审批、同意
 */
public interface SmChaincode {


    /**
     * 链码打包
     * @param chaincodeLabel 链码名
     * @param chaincodeType  链码类型
     * @param chaincodeSourceLocation 链码文件存放位置
     * @param chaincodePath java链码默认为空
     * @param metadadataSource 索引文件位置
     * @return
     */
    LifecycleChaincodePackage createLifecycleChaincodePackage(
            String chaincodeLabel,
            TransactionRequest.Type chaincodeType,
            Path chaincodeSourceLocation,
            String chaincodePath,
            Path metadadataSource
    );

    /**
     * 安装链码
     * @param lifecycleChaincodePackage
     * @return
     */
    String lifecycleInstallChaincode(
            LifecycleChaincodePackage lifecycleChaincodePackage
    );

    /**
     * 审批链码
     * @param sequence  序列号，初始值为1，后续累计即可
     * @param chaincodeName 链码名
     * @param chaincodeVersion 版本号
     * @param chaincodeEndorsementPolicy 链码的策略，默认为组织或
     * @param chaincodeCollectionConfiguration 私有数据定义
     * @param initRequired 是否初始化，默认为false
     * @param org1ChaincodePackageID 带审批链码的 ID
     * @return
     */
    CompletableFuture<BlockEvent.TransactionEvent> lifecycleApproveChaincodeDefinitionForMyOrg(
            long sequence,
            String chaincodeName,
            String chaincodeVersion,
            LifecycleChaincodeEndorsementPolicy chaincodeEndorsementPolicy,
            ChaincodeCollectionConfiguration chaincodeCollectionConfiguration,
            boolean initRequired,
            String org1ChaincodePackageID
    );


    /**
     * 向通道提交链码
     * @param definitionSequence 是否初始化，默认为false
     * @param chaincodeName 链码名
     * @param chaincodeVersion 版本号
     * @param chaincodeEndorsementPolicy 背书策略
     * @param chaincodeCollectionConfiguration 私有数据集合
     * @param initRequired 是否需要初始化，默认false
     * @param endorsingPeers peer节点信息
     * @return
     */
    CompletableFuture<BlockEvent.TransactionEvent> commitChaincodeDefinitionRequest(
            long definitionSequence,
            String chaincodeName,
            String chaincodeVersion,
            LifecycleChaincodeEndorsementPolicy chaincodeEndorsementPolicy,
            ChaincodeCollectionConfiguration chaincodeCollectionConfiguration,
            boolean initRequired,
            Collection<Peer> endorsingPeers
    );
}
